{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 逻辑回归\n",
    "构建模型预测某个学生是否能被大学录取，你有之前申请学生的两次考试成绩和最终录取的结果，需要你构建一个评估录取的分类模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 绘制样本图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "       Exam1      Exam2  Admitted\n0  34.623660  78.024693         0\n1  30.286711  43.894998         0\n2  35.847409  72.902198         0\n3  60.182599  86.308552         1\n4  79.032736  75.344376         1",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Exam1</th>\n      <th>Exam2</th>\n      <th>Admitted</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>34.623660</td>\n      <td>78.024693</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>30.286711</td>\n      <td>43.894998</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>35.847409</td>\n      <td>72.902198</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>60.182599</td>\n      <td>86.308552</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>79.032736</td>\n      <td>75.344376</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path = 'ex2data1.txt'\n",
    "data = pd.read_csv(path, header=None, names=['Exam1', 'Exam2', 'Admitted'])\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "            Exam1       Exam2    Admitted\ncount  100.000000  100.000000  100.000000\nmean    65.644274   66.221998    0.600000\nstd     19.458222   18.582783    0.492366\nmin     30.058822   30.603263    0.000000\n25%     50.919511   48.179205    0.000000\n50%     67.032988   67.682381    1.000000\n75%     80.212529   79.360605    1.000000\nmax     99.827858   98.869436    1.000000",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Exam1</th>\n      <th>Exam2</th>\n      <th>Admitted</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>count</th>\n      <td>100.000000</td>\n      <td>100.000000</td>\n      <td>100.000000</td>\n    </tr>\n    <tr>\n      <th>mean</th>\n      <td>65.644274</td>\n      <td>66.221998</td>\n      <td>0.600000</td>\n    </tr>\n    <tr>\n      <th>std</th>\n      <td>19.458222</td>\n      <td>18.582783</td>\n      <td>0.492366</td>\n    </tr>\n    <tr>\n      <th>min</th>\n      <td>30.058822</td>\n      <td>30.603263</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>25%</th>\n      <td>50.919511</td>\n      <td>48.179205</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>50%</th>\n      <td>67.032988</td>\n      <td>67.682381</td>\n      <td>1.000000</td>\n    </tr>\n    <tr>\n      <th>75%</th>\n      <td>80.212529</td>\n      <td>79.360605</td>\n      <td>1.000000</td>\n    </tr>\n    <tr>\n      <th>max</th>\n      <td>99.827858</td>\n      <td>98.869436</td>\n      <td>1.000000</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "绘制训练集中的样本数据，positive表示接受，negative表示未接受"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 1200x800 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+0AAAKnCAYAAADz86ytAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAACBaklEQVR4nO3de3xU9Z3/8fdMhkAkThCVhNSIoEZQglVxMQQoq7NVV/1RQhVdjKioS0ldCV6q24qKF7xUsLQbsC1qG2uNskbErTewwSQgRRSLlxoUlKmQqFUyRAfGZM7vj9MMmWSSTJK5nJl5PR+PeQxzzjeTb5hc5n2+3+/nazMMwxAAAAAAALAce7w7AAAAAAAAQiO0AwAAAABgUYR2AAAAAAAsitAOAAAAAIBFEdoBAAAAALAoQjsAAAAAABZFaAcAAAAAwKII7QAAAAAAWJQj3h2wAr/fr927d+vQQw+VzWaLd3cAAAAAAEnOMAzt27dPubm5stu7Hk8ntEvavXu38vLy4t0NAAAAAECKcbvdOuqoo7o8T2iXdOihh0oy/7OcTmecewMAAAAASHYej0d5eXmBPNoVQrsUmBLvdDoJ7QAAAACAmOlpiTaF6AAAAAAAsChCOwAAAAAAFkVoBwAAAADAoljTDgAAAABhMAxDLS0tam1tjXdXkADS0tLkcDj6va04oR0AAAAAeuDz+bRnzx5988038e4KEsghhxyi4cOHKz09vc/PQWgHAAAAgG74/X7t3LlTaWlpys3NVXp6er9HT5HcDMOQz+fT559/rp07d+r444+X3d631emEdgAAAADohs/nk9/vV15eng455JB4dwcJIiMjQwMGDNAnn3win8+nQYMG9el5KEQHAAAAAGHo60gpUlckvmf4rgMAAAAAwKII7QAAAACAgNtvv13f/e53+/UcH3/8sWw2m7Zu3RqRPoVj6tSpmj9/fsw+X6wQ2gEAAAAgyW3cuFFpaWk677zzYvL58vLytGfPHo0dO1aSVF1dLZvNpr179wa1S9agHUlxDe2vvfaaLrjgAuXm5spms+nZZ58NOm8YhhYuXKjhw4crIyNDLpdL27dvD2rz5ZdfatasWXI6nRoyZIjmzJmj5ubmGH4VAAAAABA+r1dqbDTvY2XlypW69tpr9dprr2n37t1R/3xpaWnKycmRw0Ht8/6Ka2j/+uuvdfLJJ+t//ud/Qp6///77tWzZMq1YsUKbNm3S4MGDdfbZZ2v//v2BNrNmzdK7776rV155Rc8//7xee+01XXPNNbH6EgAAAAAgLLW1UnGxlJkp5eSY98XFUl1ddD9vc3OzKisr9aMf/UjnnXeeHnvssaDz9957r7Kzs3XooYdqzpw5QXlLki6//HL94Ac/0D333KPs7GwNGTJEixYtUktLi2688UYNHTpURx11lB599NHAx7SfHv/xxx/rX//1XyVJhx12mGw2my6//HJdfvnlWr9+vX7xi1/IZrPJZrPp448/liS98847Ovfcc5WZmans7GyVlJToiy++CDz/119/rcsuu0yZmZkaPny4Hnzwwej851lAXEP7ueeeq7vuukvTp0/vdM4wDD300EP62c9+pmnTpmncuHH6/e9/r927dwdG5N9//329+OKL+u1vf6sJEyZo0qRJ+uUvf6knn3wyJlePAAAAACAcy5dLU6ZIa9ZIfr95zO83H0+eLK1YEb3P/dRTT2n06NE64YQTdOmll+qRRx6RYRiBc7fffrvuuecevfHGGxo+fLjKy8s7Pcerr76q3bt367XXXtOSJUt022236fzzz9dhhx2mTZs2ae7cufrP//xP/f3vf+/0sXl5efrf//1fSdIHH3ygPXv26Be/+IV+8YtfqLCwUFdffbX27NmjPXv2KC8vT3v37tWZZ56pU045RW+88YZefPFFNTY26qKLLgo854033qj169dr9erVevnll1VdXa0333wzSv+D8WXZNe07d+5UQ0ODXC5X4FhWVpYmTJigjRs3SjLXZQwZMkTjx48PtHG5XLLb7dq0aVOXz33gwAF5PJ6gGwAAAABEQ22tVFoqGYbU0hJ8rqXFPD5vXvRG3FeuXKlLL71UknTOOeeoqalJ69evlyQ99NBDmjNnjubMmaMTTjhBd911l0488cROzzF06FAtW7ZMJ5xwgq688kqdcMIJ+uabb/Tf//3fOv7443XLLbcoPT1dtbW1nT42LS1NQ4cOlSQNGzZMOTk5ysrKUlZWltLT03XIIYcoJydHOTk5SktL069+9SudcsopuueeezR69GidcsopeuSRR/TnP/9Z9fX1am5u1sqVK/Xzn/9cZ511lgoKCvS73/1OLR3/c5OEZUN7Q0ODJCk7OzvoeHZ2duBcQ0ODhg0bFnTe4XBo6NChgTahLF68OPBNkpWVpby8vAj3HgAAAABMS5ZIaWndt0lLk5Yujfzn/uCDD/SXv/xFl1xyiSQzL82cOVMrV66UZM5enjBhQtDHFBYWdnqek046KWjP8ezsbBUUFLTrf5oOP/xwffbZZ/3u89tvv60///nPyszMDNxGjx4tSfroo4/00UcfyefzBfV76NChOuGEE/r9ua0oJasC3HLLLVqwYEHgscfjIbgDAAAAiDivV1q9+uCU+K60tEhVVWb7jIzIff6VK1eqpaVFubm5gWOGYWjgwIH61a9+FfbzDBgwIOixzWYLeczf0xcahubmZl1wwQW67777Op0bPny4Pvzww35/jkRi2ZH2nJwcSVJjY2PQ8cbGxsC5nJycTldyWlpa9OWXXwbahDJw4EA5nc6gGwAAAABEmsfTc2Bv4/eb7SOlpaVFv//97/Xggw9q69atgdvbb7+t3Nxc/fGPf9SYMWM6LS1+/fXXI9eJf0pPT5cktba2djre8dipp56qd999V8ccc4yOO+64oNvgwYN17LHHasCAAUH9/uqrr1RfXx/xfluBZUP7yJEjlZOTo3Xr1gWOeTwebdq0KTBdo7CwUHv37tWWLVsCbV599VX5/f5OUzwAAAAAINacTskeZuqy2832kfL888/rq6++0pw5czR27Nig24wZM7Ry5Updd911euSRR/Too4+qvr5et912m959993IdeKfRowYIZvNpueff16ff/55YJvuY445Rps2bdLHH3+sL774Qn6/X6Wlpfryyy91ySWXaPPmzfroo4/00ksv6YorrlBra6syMzM1Z84c3XjjjXr11Vf1zjvv6PLLLw+avp9M4vpVNTc3B672SGbxua1bt2rXrl2y2WyaP3++7rrrLj333HPatm2bLrvsMuXm5uoHP/iBJGnMmDE655xzdPXVV+svf/mL6urq9OMf/1gXX3xx0PQPxInP17/zAAAAQILLyJCmTZN62q7c4ZCmT4/81HiXy6WsrKxO52bMmKE33nhDY8aM0a233qqbbrpJp512mj755BP96Ec/ilwn/uk73/mO7rjjDt18883Kzs7Wj3/8Y0nSDTfcoLS0NJ144ok68sgjtWvXLuXm5qqurk6tra36/ve/r4KCAs2fP19DhgwJBPMHHnhAkydP1gUXXCCXy6VJkybptNNOi3i/rcBmtNX6j4Pq6urAfn3tzZ49W4899pgMw9Btt92mX//619q7d68mTZqk8vJy5efnB9p++eWX+vGPf6w1a9bIbrdrxowZWrZsmTIzM8Puh8fjUVZWlpqampgqHymVldLChdLatVKoegFut+RySYsWSTNnxr5/AAAAQJj279+vnTt3auTIkRo0aFCvP7621tzurbvkZbNJNTVSUVE/OgrL6e57J9wcGtfQbhWE9gjz+aSCAqm+Xho1SqquDg7ubrc0daq0Y4eUny9t2yb9c40LAAAAYDX9De2SuQ/7vHlmlfj2O5M5HFJrq1ReLs2dG6EOwzIiEdqTc9I/4is93RxhHzXKDOZTp5pBXQoO7KNGme0I7AAAAEhyc+eaI+nTph1c4263m49ragjs6FpKbvmGGMjLM0fY2wL61KlSRYVUUnIwsHccgQcAAACSWFGRefN6zSrxTmdk17AjORHaET0dg3vbAh0COwAAAFJYRgZhHeFjejyiKy/PHGFvr6KCwA4AAAAAYSC0I7rcbnNKfHslJQfXuAMAAAAAukRoR/R0LDpXVxe6OB0AAAAAICRCO6KjY2CvrpYmTjTvCe4AAAvzeqXGRvMeAIB4I7Qj8nw+yeUKXSW+rThdW3B3ucz2AADEWW2tVFwsZWZKOTnmfXGxOVEMAIB4IbQj8tLTpUWLpPz80FXi24J7fr7Zjn3au8WIDwBE3/Ll0pQp0po1kt9vHvP7zceTJ0srVsS3fwCQCqZOnar58+f36zkee+wxDRkyJCL9CZfNZtOzzz4btecntCM6Zs6Utm3rukp8Xp55fubM2PYrgTDiAwCxUVsrlZZKhiG1tASfa2kxj8+bx+9fAInp8ssvl81m07333ht0/Nlnn5XNZuvVcx1zzDF66KGHwm6/ePFipaWl6YEHHujV5+mPmTNnqr6+PvD49ttv13e/+91O7aIdtCOJ0I7o6WkEnRH2LjHiAwCxs2SJlJbWfZu0NGnp0tj0B0CS6mlJaBSXjA4aNEj33Xefvvrqq6h9jlAeeeQR3XTTTXrkkUdi9jkzMjI0bNiwmH2+WCC0AxbDiA8AxI7XK61e3fn3bUctLVJVFUuVAPRRZaVUUNB1EWa32zxfWRmVT+9yuZSTk6PFixd32+5///d/ddJJJ2ngwIE65phj9OCDDwbOTZ06VZ988onKyspks9l6HKVfv369vF6vFi1aJI/How0bNgSd//rrr3XZZZcpMzNTw4cPD/pcbY455hjdddddgXYjRozQc889p88//1zTpk1TZmamxo0bpzfeeCPwMe2nxz/22GO644479Pbbbwf6/Nhjj+mYY46RJE2fPl02my3wWJJWr16tU089VYMGDdKoUaN0xx13qKXdH4nt27drypQpGjRokE488US98sor3f4/RAKhHbAYRnwAIHY8noMzmnri95vtAaBXfD5p4UKpvj707kltuy7V15vtojDinpaWpnvuuUe//OUv9fe//z1kmy1btuiiiy7SxRdfrG3btun222/Xrbfeqscee0yS9Mwzz+ioo47SokWLtGfPHu3Zs6fbz7ly5UpdcsklGjBggC655BKtXLky6PyNN96o9evXa/Xq1Xr55ZdVXV2tN998s9PzLF26VEVFRXrrrbd03nnnqaSkRJdddpkuvfRSvfnmmzr22GN12WWXyTCMTh87c+ZMXX/99TrppJMCfZ45c6Y2b94sSXr00Ue1Z8+ewOOamhpddtlluu666/Tee+/p4Ycf1mOPPaa7775bkuT3+1VcXKz09HRt2rRJK1as0E9+8pPu//MjwYDR1NRkSDKampri3RWkuG++MQy73TDM8fTub3a72R4A0Hf83gUQDq/Xa7z33nuG1+vt2xPs2mUYo0aZv0xGjTIfd3c8gmbPnm1MmzbNMAzDOOOMM4wrr7zSMAzDqKqqMtrHwf/4j/8w/u3f/i3oY2+88UbjxBNPDDweMWKEsXTp0h4/Z1NTk5GRkWFs3brVMAzDeOutt4zMzExj3759hmEYxr59+4z09HTjqaeeCnzMP/7xDyMjI8O47rrrgj7fpZdeGni8Z88eQ5Jx6623Bo5t3LjRkGTs2bPHMAzDePTRR42srKzA+dtuu804+eSTO/VRklFVVRV07KyzzjLuueeeoGMVFRXG8OHDDcMwjJdeeslwOBzGp59+Gjj/wgsvhHyuNt1974SbQxlpByyEER8A4WBXicjJyJCmTZMcju7bORzS9OlmewDotY7bHk+dKm3YYN6H2iY5Su677z797ne/0/vvv9/p3Pvvv6+ioqKgY0VFRdq+fbtaW1t79Xn++Mc/6thjj9XJJ58sSfrud7+rESNGqPKf0/8/+ugj+Xw+TZgwIfAxQ4cO1QknnNDpucaNGxf4d3Z2tiSpoKCg07HPPvusV30M5e2339aiRYuUmZkZuF199dXas2eP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tAPo0ty5Uk2NOVW+bY273W4+rqkxzwNAG69XWr268wh7Ry0tUlVVYk8lT7UZBakq7NA+YsQIbdmyRZL0xRdf6N1331VRu8vaDQ0NysrKinwPASSm9HRp0SIpPz90lfi24J6fb7Zjn3YA3SgqklatMrd1a2gw71etYoQdQGceT3hbRUpmO48nuv2JplSaUZDKeijtctDs2bNVWlqqd999V6+++qpGjx6t0047LXB+w4YNGjt2bFQ6CViez9d96OzpfLKaOdOsDtXV156XJ23blpr/NymKLXfQXxkZfO8A6F7bzhPhBPdE3nmibUZBT19n+xkF/P5MTGGPtN900026+uqr9cwzz2jQoEF6+umng87X1dXpkksuiXgHAcurrJQKCrpel+12m+crK2PbL6voKZAT2FMCBXIAALGSKjtPpNKMglRnMwzDiHcn4i3cTe2BTnw+M5DX13dety0FF2LLz2dUGSlp+XJzvV1aWvB6O4fDrPpdXs6aZABAZNXWmsXZuks6NptZFyNRl9l4veZF8HBnFDQ3J+4FimQVbg4Ne6QdQAjp6dLataEroXesnL52LYEdKYcCOQCAeEiFnSdSZUYBCO1A/3WshD51qrRhQ+etzjoWYgNSAAVyAADxkgo7TyxYYM5a605rq1RWFpv+IDqYHi+mxyNC2o+styGwI4UxbQ8AYBXJXAh1xQpz1hrL0BIP0+OBWMvLkyoqgo9VVBDYkbIokAMAsIqMDCk7O/kCu5QaMwpSXdhbvgHogdstlZQEHyspYaQdKStVttwBACDeiorMWzLPKEhlvRpp37Nnjx5//HH96U9/ks/nCzr39ddfa9GiRRHtHJAwOhadq6sLXZwOSCEUyAEAILaSeUZBKgt7TfvmzZv1/e9/X36/X99++62+853v6Nlnn9VJJ50kSWpsbFRubq5ae6qEYEGsaUe/dAzsbSPrXR0HUkgqbLkDAADQFxFf0/7f//3fmj59ur766is1Njbq3/7t3/S9731Pb731VkQ6DCQkn09yuUIH845V5V0usz2QQlJhyx0AAIBoCju0b9myRTfffLPsdrsOPfRQlZeX64YbbtBZZ52lzZs3R7OPgHWlp0uLFkn5+aFH0tuCe36+2Y592pGCKJADAADQd70qRLd///6gxzfffLMcDoe+//3v65FHHolox4CEMXOmuSC3q0Celydt20Zg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q66uTjU1NSHPG4ah3NxcXX/99brhhhskSU1NTcrOztZjjz2miy++OKzPw5ZvcdI+XLRhpB2JyuczA3l9fejv4/bf7/n50rZtka/ZYIU+ABHi9ZrVf53O5FubCADov2T4OxG1Ld9efvll3XvvvYHALknHHnus6urq9J//+Z99620XnnvuOY0fP14XXnihhg0bplNOOUW/+c1vAud37typhoYGuVyuwLGsrCxNmDBBGzdujGhfEGFM30WysUKRxfR0adEiM5CHuvjVtiwlP99sl2SB3euVGhvNeyS+jAwpOztx34gBAKIrlf5O9Dq0f+973wv9RHa7br311n53qL0dO3Zo+fLlOv744/XSSy/pRz/6kf7rv/5Lv/vd7yRJDQ0NkqTs7Oygj8vOzg6cC+XAgQPyeDxBN8QQ03eRrKxQZHHmTHMEvavPkZdnnp85M3p9iLHaWqm4WMrMlHJyzPviYvNaIAAAQKILO7T/+7//u5qamgKP7733Xu3duzfw+B//+IdOPPHEiHbO7/fr1FNP1T333KNTTjlF11xzja6++mqtWLGiX8+7ePFiZWVlBW55TMWOHZ9PcrlCB5iOgcflYp92JB4rFFnsaQQ9iUbYly+XpkyR1qyR/H7zmN9vPp48WernnwsAAIC4Czu0v/TSSzpw4EDg8T333KMvv/wy8LilpUUffPBBRDs3fPjwThcCxowZo127dklSoGJ9Y2NjUJvGxsZuq9nfcsstampqCtzcjOjGTopP30WKoMhiTNTWSqWlkmFILS3B51pazOPz5jHiDgAAElvYob1jvbpe1q/rk6Kiok4XAurr6zVixAhJ0siRI5WTk6N169YFzns8Hm3atEmFhYVdPu/AgQPldDqDboihFJy+ixTDHukxsWSJlJbWfZu0NGnp0tj0BwAAIBr6tE97rJSVlen111/XPffcow8//FBPPPGEfv3rX6u0tFSSZLPZNH/+fN1111167rnntG3bNl122WXKzc3VD37wg/h2Ht1Loem7SDEUWYwJr1davbrzCHtHLS1SVRXF6QAAQOJy9NzEZLPZZLPZOh2LptNPP11VVVW65ZZbtGjRIo0cOVIPPfSQZs2aFWhz00036euvv9Y111yjvXv3atKkSXrxxRc1aNCgqPYNADoJVWSxbclH2/GpU9nWMAI8noNr2Hvi95vtU6G6LAAASD5h79Nu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0ogRI3TkkUcG2rz99ttqbm7W4YcfHvR8Xq83aKkAAABWR2gHAMBiBg8eHJge3pUNGzZIkr788kt9+eWXGjx4cODcBRdcoBEjRug3v/mNcnNz5ff7NXbsWPl8vqDnGDBgQODfNpst5LGOU+r7auzYsRo7dqzmzZunuXPnavLkyVq/fr3Gjx8fkedv//VLUnNzs4YPH67q6upObYcMGRKRzwkAQCywph0AgATz0UcfqaysTL/5zW80YcIEzZ49OxCu//GPf+iDDz7Qz372M5111lkaM2aMvvrqqzj3ONiJJ54oyVx7f+ihh+qYY47RunXrQrYdM2aM3G633G534Nh7772nvXv3Bp4nlFNPPVUNDQ1yOBw67rjjgm5HHHFEZL8gAACiiJF2AAAs5sCBA2poaAg65nA4dMQRR6i1tVWXXnqpzj77bF1xxRU655xzVFBQoAcffFA33nijDjvsMB1++OH69a9/reHDh2vXrl26+eabI9Ivn8+n9957L/DvTz/9VFu3blVmZmaXMwN+9KMfKTc3V2eeeaaOOuoo7dmzR3fddZeOPPJIFRYWSjKrv8+dO1fDhg3Tueeeq3379qmurk7XXnutXC6XCgoKNGvWLD300ENqaWnRvHnz9L3vfa/bUXqXy6XCwkL94Ac/0P3336/8/Hzt3r1b//d//6fp06dHbIQfAIBoY6QdAACLefHFFzV8+PCg26RJkyRJd999tz755BM9/PDDksw147/+9a/1s5/9TG+//bbsdruefPJJbdmyRWPHjlVZWZkeeOCBiPRr9+7dOuWUU3TKKadoz549+vnPf65TTjlFV111VZcf43K59Prrr+vCCy9Ufn6+ZsyYoUGDBmndunWB9eazZ8/WQw89pPLycp100kk6//zztX37dknmFP3Vq1frsMMO05QpU+RyuTRq1ChVVlZ221ebzaY//elPmjJliq644grl5+fr4osv1ieffBJYvw8AQCKwGYZhxLsTAAAAAACgM0baAQAAAACwKEI7AAAAAAAWRWgHAAAAAMCiCO0AAAAAAFgUoR0AAAAAAIsitAMAAAAAYFGEdgAAAAAALIrQDgAAAACARRHaAQAAAACwKEI7AAAAAAAWRWgHAAAAAMCiCO0AAAAAAFjU/wfunHZ1+Xq3NwAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 仅保留\"Admitted\"列中值为1的行\n",
    "positive = data[data['Admitted'].isin([1])]\n",
    "negative = data[data['Admitted'].isin([0])]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "# \"positive['Exam1']\"和\"positive['Exam2']\"用作散点图的x和y坐标，\"s=50\"表示散点的大小设置为50个像素。\n",
    "# \"c='b'\"表示散点的颜色设置为蓝色（blue）。\n",
    "# \"marker='o'\"表示散点的形状设置为圆形（circle）。\n",
    "# \"label='Admitted'\"表示为这些散点添加一个标签，标签内容为\"Admitted\"，用于图例（legend）的显示。\n",
    "ax.scatter(positive['Exam1'], positive['Exam2'], s=50, c='b', marker='o', label='Admitted')\n",
    "ax.scatter(negative['Exam1'], negative['Exam2'], s=50, c='r', marker='x', label='Not Admitted')\n",
    "ax.legend()\n",
    "ax.set_xlabel('Exam1 Score')\n",
    "ax.set_ylabel('Exam2 Score')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## sigmoid函数\n",
    "\n",
    "![](img/sigmoid.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 接受一个数值或一个数组作为输入，并将每个元素转换为0到1之间的值。\n",
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 1200x800 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9UAAAKTCAYAAAAXPCvaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABR+ElEQVR4nO3deXgddaE+8DfpkhahLaXQBcoissm+1qKoaKUssigIAgoioiAgUq4CXgXRq0WQRQHhogj4Q1avgMgmFIELVJBNBAEFgbK1UJYWWtrSZn5/zE1LaFOaNMmcJJ/P85xnvpkzk7zpcTx5me+ZqSuKoggAAADQavVVBwAAAICuSqkGAACANlKqAQAAoI2UagAAAGgjpRoAAADaSKkGAACANlKqAQAAoI16Vx1gSTQ2NuaFF17Icsstl7q6uqrjAAAA0M0VRZE33ngjI0aMSH19y+eju0SpfuGFFzJy5MiqYwAAANDDPPvss1lllVVafL5LlOrlllsuSfnLDBgwoOI0AAAAdHfTp0/PyJEj5/fRlnSJUt005XvAgAFKNQAAAJ3mvT6C7EJlAAAA0EZKNQAAALSRUg0AAABtpFQDAABAGynVAAAA0EZKNQAAALSRUg0AAABtpFQDAABAGynVAAAA0EZKNQAAALSRUg0AAABtpFQDAABAGynVAAAA0EZKNQAAALSRUg0AAABtpFQDAABAGynVAAAA0EZKNQAAALSRUg0AAABtpFQDAABAGynVAAAA0EatLtW33357dt5554wYMSJ1dXW56qqr3nOfW2+9NZtttlkaGhrygQ98IBdccEEbogIAAEBtaXWpnjFjRjbeeOOcddZZS7T9U089lZ122inbbrttHnzwwXzzm9/MV77yldx4442tDgsAAAC1pHdrd9hhhx2yww47LPH255xzTtZYY42ccsopSZL11lsvd9xxR0477bSMHTu2tT8eAAAAakarS3VrTZw4MWPGjGm2buzYsfnmN7/Z4j6zZ8/O7Nmz5389ffr0jooHAAB0tqJI5s1L5s5t/ljUusU93rl9Y2P5mDev+XJpx0Wx8HJR61r73DsfTf8mLT1a83zTuKVlW7Z55+vW1vG7v/7KV5IvfWmh/2l0RR1eqidPnpyhQ4c2Wzd06NBMnz49b731Vvr377/QPuPHj88JJ5zQ0dEAAKBnaWxMZs4sHzNmLFi+c9y0nD07mTNn4eWi1i3uuXePm8owPVs3mrXc4aW6LY499tiMGzdu/tfTp0/PyJEjK0wEAAAVmTMnee218vHqqwvGTV+/8UbLxfjd6956q+rf5r316ZP07p306lUuW3q88/levcpHff2C5TvHbVn3zkdd3YLlO8dtfW5Rj6Tl51rzfEvLJdlmccvWjt/r+fXWW/Tr3wV1eKkeNmxYpkyZ0mzdlClTMmDAgEWepU6ShoaGNDQ0dHQ0AADoHEWxoAS/sxgvyXjGjI7JtMwy5eN971uwbBovs0zSr1/S0JD07Vs+msbvXi7puoaGsjAvrjTXu+MvXU+Hl+rRo0fnuuuua7bupptuyujRozv6RwMAQMcriuTll5PnnkuefXbRy+eeK884t1VdXTJwYDJ4cLL88uWjaTxgQPNC/O7xoopzv34KLLSTVpfqN998M0888cT8r5966qk8+OCDGTx4cFZdddUce+yxef755/Ob3/wmSXLwwQfnzDPPzLe//e18+ctfzi233JLLL7881157bfv9FgAA0BHauzAvu+zCpXhRRfndzw8YUJ7ZBWpOq0v1vffem2233Xb+102ffd5///1zwQUX5MUXX8ykSZPmP7/GGmvk2muvzZFHHpmf/exnWWWVVfKrX/3K7bQAAKgNRZFMnpw89FDyt78lDz+cPPNM6wpzXV0ydGiyyirJyJHNl03j4cPLKdBAt1JXFO++znntmT59egYOHJhp06ZlwIABVccBAKCrmjUr+cc/ygLdVKIfeiiZOrXlfZoKc0tleZVVkhEjys8NA93GkvbQmrz6NwAALJWiSJ5/vnlxfuih5PHHF307p/r6ZO21k402Kh9rrtn8DLPCDLRAqQYAoGubOTN55JGFzz6/9tqitx88ONl44wUFeuONkw9+MGnhzjQAi6NUAwDQtbz6avKnPyXXXZfcc0/yr38ljY0Lb9erV7Luus0L9EYblVO133nfXICloFQDAFDbiqK8eNi115aPu+5auESvuOLCZ5/XW8+FwYAOp1QDAFB7Zs5MbrmlLNHXXZe84+4ySZL110922in5xCfKAj1sWDU5gR5PqQYAoDY89VRZoK+9Nvnzn8srdTfp168s0DvtlOy4Y7L66pXFBHgnpRoAgGq8/XZy550LpnU/+mjz51dbbUGJ3nbbZJllqskJsBhKNQAAneell5Lrry9L9J/+lEybtuC5Xr2SD3+4LNI77VRekdsFxYAap1QDANCx/v3v5KKLyiL917+WFx5rMmRIssMOZYnebrtk+eWrywnQBko1AAAd48EHk5/8JLn88uZX69500wVno7fcsjxDDdBFKdUAALSfokhuuy058cTkxhsXrN9uu2TPPcuz0iNGVJcPoJ0p1QAALL3GxuQPfyjL9N13l+vq65O99kqOPrq87RVAN6RUAwDQdnPmJL/9bXLSScljj5Xr+vVLvvzl5Kijkve/v9p8AB1MqQYAoPXefDP55S+TU09NnnuuXDdwYHLoock3vpEMHVptPoBOolQDALDkpk5NzjijfLz2Wrlu+PDkyCOTr30tGTCg2nwAnUypBgDgvT3zTHLKKcmvfpW89Va5bq21km9/O/niF5OGhmrzAVREqQYAoGUPP1x+Xvrii5N588p1m2+eHHNM8pnPuB0W0OMp1QAALOzOO8t7TF9zzYJ1Y8aUZfoTn0jq6qrLBlBDlGoAAEpFkVx/fTJ+fHLHHeW6urpk993L22JtsUW1+QBqkFINAEDy+uvJQQclv/td+XXfvsl++yXf+lay9tqVRgOoZUo1AEBP95e/JJ//fHkxst69kyOOSMaNS0aMqDoZQM1TqgEAeqrGxuTkk5PvfjeZOzd5//uTSy5Jttqq6mQAXYZSDQDQE02ZUk7v/tOfyq/32iv57/9OBg6sNhdAF1NfdQAAADrZTTclG29cFur+/ct7T19yiUIN0AZKNQBAT/H228mxxyZjx5ZnqjfYILn33uTAA90iC6CNTP8GAOgJnn462WefZOLE8uuDD05OPbU8Uw1AmynVAADd3f/8T/KVr5S3zRo4sJzuvcceVacC6BZM/wYA6K7eeiv5+tfLAv3668mHPpQ8+KBCDdCOlGoAgO7o0UeTUaOSs88uvz7mmOT225PVV680FkB3Y/o3AEB3UhTJ+ecnhx+ezJyZrLRS8v/+X7LddlUnA+iWlGoAgO5i+vTyAmSXXFJ+/alPJb/5TTJsWLW5ALox078BALqDe+9NNtusLNS9eiXjxyc33KBQA3QwZ6oBALqyxsbk9NPLz0y//Xay2mplsR49uupkAD2CUg0A0FW9/HLypS8l111Xfr377uXtsgYNqjIVQI9i+jcAQFd0663JxhuXhbqhobzK9xVXKNQAncyZagCAruZPf0p22imZOzdZb73kssuSDTesOhVAj+RMNQBAV3L//eU077lzy+Vf/6pQA1TImWoAgK7i3/9OdtwxefPN5JOfTC6+OOnbt+pUAD2aM9UAAF3Byy8n22+fTJlSfpb6979XqAFqgFINAFDrZsxIPv3p5F//Km+Zdd11yYABVacCIEo1AEBtmzs3+fznk3vuSQYPTm64IRkxoupUAPwfpRoAoFYVRXLwwckf/5j065dcc02y7rpVpwLgHZRqAIBadcIJyXnnJfX1yaWXJltvXXUiAN5FqQYAqEXnnluW6iT5xS+SXXetNg8Ai6RUAwDUmmuuSQ45pBx/73vJ175WbR4AWqRUAwDUkr/8Jdlrr6SxMfnylxecrQagJinVAAC14vHHy1tnvfVWsuOOyTnnJHV1VacCYDGUagCAWvDii8n22yevvJJsuWVy+eVJnz5VpwLgPSjVAABVmz69PDP99NPJBz6QXHtt8r73VZ0KgCWgVAMAVGnOnGT33ZMHH0xWWim58cZkxRWrTgXAElKqAQCq0nQxsptvLs9MX3dd8v73V50KgFZQqgEAqnLMMclvf5v07p38z/8km29edSIAWkmpBgCows9+lpx8cjk+77xk7Nhq8wDQJko1AEBnu/zy5Mgjy/GPf5zst1+1eQBoM6UaAKAz3XZb8sUvJkWRHHpoOQUcgC5LqQYA6Cx//3uy667lFb8/+9lyCnhdXdWpAFgKSjUAQGd49tlkhx2SadOSj3wkueiipFevqlMBsJSUagCAjvbaa8n22yfPP5988IPJH/6Q9O9fdSoA2oFSDQDQkWbNKqd8/+MfycorJ9dfnyy/fNWpAGgnSjUAQEc6+ODkf/83GTiwLNSrrlp1IgDakVINANBRJkxILrwwqa9Prrwy2XDDqhMB0M6UagCAjjB7dvL1r5fjr3892XbbavMA0CGUagCAjvDTnyb//GcydGjyX/9VdRoAOohSDQDQ3v797wVF+tRTy89TA9AtKdUAAO2pKJLDDy+v+v3JTyZ77111IgA6kFINANCerrwyue66pE+f5Kyzkrq6qhMB0IGUagCA9vLmm8kRR5Tjb387WWedavMA0OGUagCA9nLCCclzzyVrrJH8539WnQaATqBUAwC0h7//PTnttHJ85plJ//7V5gGgUyjVAABLq7ExOeSQZN685LOfTXbcsepEAHQSpRoAYGldeGFy553J+96XnH561WkA6ERKNQDA0njlleRb3yrH3/9+MnJkpXEA6FxKNQDA0jjmmLJYb7DBgit/A9BjKNUAAG01cWLyq1+V47PPLu9NDUCPolQDALTF3LnlxcmS5IADko98pNo8AFRCqQYAaIszzkj+9rdk8ODkpJOqTgNARZRqAIDWeu655LjjyvFPfpIMGVJtHgAqo1QDALTWuHHJm28mo0cnX/5y1WkAqJBSDQDQGjfemFxxRdKrV3lxsnp/TgH0ZN4FAACW1FtvJYceWo6/8Y1k442rzQNA5ZRqAIAldeKJyZNPJiNGJCecUHUaAGqAUg0AsCT+9a+yVCfJ6acnyy1XaRwAaoNSDQDwXoqinPY9Z04ydmyyxx5VJwKgRijVAADv5fLLk5tuShoakjPPTOrqqk4EQI1QqgEAFmf69OTII8vxsccmH/hAtXkAqClKNQDA4hx3XPLii2WZPvroqtMAUGOUagCAljzwQHLGGeX4F79I+vWrNg8ANUepBgBYlMbG5JBDyuVeeyWf+lTViQCoQUo1AMCi/PKXyd13l7fOOvXUqtMAUKOUagCAd3vppfKiZEnywx8mI0ZUmweAmqVUAwC827e/nbz2WrLJJuX9qQGgBUo1AMA73X57cuGF5b2ozz476d276kQA1DClGgCgydtvlxcnS5KDDko+9KFq8wBQ85RqAIAmp52W/OMfyYorJuPHV50GgC5AqQYASJJJk5ITTijHJ5+cDB5cbR4AugSlGgAgKc9Mz5yZbLNNst9+VacBoItQqgEApk5NLrigHP/wh+VFygBgCSjVAADnnJPMmpVstlny0Y9WnQaALkSpBgB6tlmzkjPPLMdHHeUsNQCtolQDAD3bJZckU6Ykq6ySfO5zVacBoItRqgGAnqsoklNPLcff+EbSp0+1eQDoctpUqs8666ysvvrq6devX0aNGpV77rlnsduffvrpWWedddK/f/+MHDkyRx55ZGbNmtWmwAAA7eamm5KHH06WXTY56KCq0wDQBbW6VF922WUZN25cjj/++Nx///3ZeOONM3bs2Lz00kuL3P7iiy/OMccck+OPPz6PPvpozjvvvFx22WX5zne+s9ThAQCWyimnlMsDD0wGDao0CgBdU11RFEVrdhg1alS23HLLnPl/F/RobGzMyJEjc/jhh+eYY45ZaPvDDjssjz76aCZMmDB/3VFHHZW77747d9xxxxL9zOnTp2fgwIGZNm1aBgwY0Jq4AACL9ve/JxttlNTXJ088kayxRtWJAKghS9pDW3Wmes6cObnvvvsyZsyYBd+gvj5jxozJxIkTF7nP1ltvnfvuu2/+FPF///vfue6667Ljjju2+HNmz56d6dOnN3sAALSr004rl5/9rEINQJv1bs3GU6dOzbx58zJ06NBm64cOHZrHHntskfvss88+mTp1aj7ykY+kKIrMnTs3Bx988GKnf48fPz4nnHBCa6IBACy5yZOT3/62HI8bV20WALq0Dr/696233pof//jH+cUvfpH7778/v//973Pttdfmhz/8YYv7HHvssZk2bdr8x7PPPtvRMQGAnuSss5I5c5LRo8sHALRRq85UDxkyJL169cqUKVOarZ8yZUqGDRu2yH2+973v5Ytf/GK+8pWvJEk23HDDzJgxI1/96lfzn//5n6mvX7jXNzQ0pKGhoTXRAACWzMyZydlnl2NnqQFYSq06U923b99svvnmzS461tjYmAkTJmR0C/+Vd+bMmQsV5169eiVJWnmNNACApfeb3ySvvFJ+jvozn6k6DQBdXKvOVCfJuHHjsv/++2eLLbbIVlttldNPPz0zZszIAQcckCTZb7/9svLKK2f8+PFJkp133jmnnnpqNt1004waNSpPPPFEvve972XnnXeeX64BADpFY+OCC5QdcUTibxEAllKrS/Vee+2Vl19+Occdd1wmT56cTTbZJDfccMP8i5dNmjSp2Znp7373u6mrq8t3v/vdPP/881lxxRWz884750c/+lH7/RYAAEvi2muTf/4zGTgw+fKXq04DQDfQ6vtUV8F9qgGAdvHxjye33ZZ861vJSSdVnQaAGtYh96kGAOiy7ruvLNS9eyff+EbVaQDoJpRqAKBnOPXUcrnXXskqq1SbBYBuQ6kGALq/Z59NLr+8HLuNFgDtSKkGALq/M85I5s4tP1O92WZVpwGgG1GqAYDu7Y03knPPLcfOUgPQzpRqAKB7+/Wvk2nTkrXXTnbaqeo0AHQzSjUA0H3NnZucfno5PvLIpN6fPgC0L+8sAED3ddVVydNPJyuskOy3X9VpAOiGlGoAoPs65ZRyecghyTLLVJsFgG5JqQYAuqeJE5O//CXp2zc59NCq0wDQTSnVAED31HSWet99k2HDqs0CQLelVAMA3c+//51ceWU5dhstADqQUg0AdD8/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1VZVpwEAalCbSvVZZ52V1VdfPf369cuoUaNyzz33tLjtL3/5y2yzzTZZfvnls/zyy2fMmDGL3R4AasKMGcnZZ5djZ6kBgBa0ulRfdtllGTduXI4//vjcf//92XjjjTN27Ni89NJLi9z+1ltvzd57750///nPmThxYkaOHJntttsuzz///FKHB4AOc+GFyWuvJWuumeyyS9VpAIAaVVcURdGaHUaNGpUtt9wyZ555ZpKksbExI0eOzOGHH55jjjnmPfefN29ell9++Zx55pnZb7/9FrnN7NmzM3v27PlfT58+PSNHjsy0adMyYMCA1sQFgNabNy9Zd93kiSeSM85IDjus6kQAQCebPn16Bg4c+J49tFVnqufMmZP77rsvY8aMWfAN6uszZsyYTJw4cYm+x8yZM/P2229n8ODBLW4zfvz4DBw4cP5j5MiRrYkJAEvnj38sC/WgQcmXvlR1GgCghrWqVE+dOjXz5s3L0KFDm60fOnRoJk+evETf4+ijj86IESOaFfN3O/bYYzNt2rT5j2effbY1MQFg6ZxySrk8+OBk2WWrzQIA1LTenfnDTjzxxFx66aW59dZb069fvxa3a2hoSENDQycmA4D/89e/Jv/7v0nv3qZ9AwDvqVWlesiQIenVq1emTJnSbP2UKVMybNiwxe7705/+NCeeeGJuvvnmbLTRRq1PCgCd4dRTy+Xeeycrr1xtFgCg5rVq+nffvn2z+eabZ8KECfPXNTY2ZsKECRk9enSL+5100kn54Q9/mBtuuCFbbLFF29MCQEeaNCm54opyPG5ctVkAgC6h1dO/x40bl/333z9bbLFFttpqq5x++umZMWNGDjjggCTJfvvtl5VXXjnjx49PkvzkJz/Jcccdl4svvjirr776/M9eL7vsslnW59QAqCU//3l55e9PfCLZZJOq0wAAXUCrS/Vee+2Vl19+Occdd1wmT56cTTbZJDfccMP8i5dNmjQp9fULToCfffbZmTNnTvbYY49m3+f444/P97///aVLDwDtZfr05Je/LMfOUgMAS6jV96muwpLeHwwA2uy008oyve66ySOPJPWt+oQUANDNdMh9qgGgW5o7N/nZz8rxkUcq1ADAEvNXAwBccUXyzDPJiismX/xi1WkAgC5EqQagZ3vzzeToo8vxYYcl/ftXmwcA6FKUagB6th/8IHn22WT11ZP/+I+q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97kccsghi3x+3rx52WmnnTJnzpzcddddufDCC3PBBRfkuOOOW+z33XffffPII4/kpptuyh//+Mfcfvvt+epXv9oRv0KPtvXWW+fFF19s9vjKV76SNdZYI1tsscVi9z3ooIOa7XfSSSd1Ump+8IMfNPu3P/zwwxe7/ZFHHplrrrkmV1xxRW677ba88MIL+exnP9tJaXu2xx57LI2Njfnv//7vPPLIIznttNNyzjnn5Dvf+c577usY63iXXXZZxo0bl+OPPz73339/Nt5444wdOzYvvfTSIre/6667svfee+fAAw/MAw88kN122y277bZbHn744U5O3jPddtttOfTQQ/OXv/wlN910U95+++1st912mTFjxmL3GzBgQLNj6ZlnnumkxKy//vrN/u3vuOOOFrd1fFXvr3/9a7PX66abbkqSfO5zn2txH8dX55kxY0Y23njjnHXWWYt8/qSTTsrPf/7znHPOObn77rvzvve9L2PHjs2sWbNa/J6tfR9slYJWO//884uBAwcutP66664r6uvri8mTJ89fd/bZZxcDBgwoZs+evcjv9Y9//KNIUvz1r3+dv+76668v6urqiueff77ds7PAnDlzihVXXLH4wQ9+sNjtPvaxjxVHHHFE54SimdVWW6047bTTlnj7119/vejTp09xxRVXzF/36KOPFkmKiRMndkBC3stJJ51UrLHGGovdxjHWObbaaqvi0EMPnf/1vHnzihEjRhTjx49f5PZ77rlnsdNOOzVbN2rUqOJrX/tah+Zk0V566aUiSXHbbbe1uE1Lf5/Q8Y4//vhi4403XuLtHV+154gjjijWXHPNorGxcZHPO76qk6S48sor53/d2NhYDBs2rDj55JPnr3v99deLhoaG4pJLLmnx+7T2fbA1nKluRxMnTsyGG26YoUOHzl83duzYTJ8+PY888kiL+wwaNKjZmdIxY8akvr4+d999d4dn7sn+8Ic/5JVXXskBBxzwntv+9re/zZAhQ7LBBhvk2GOPzcyZMzshIUly4oknZoUVVsimm26ak08+ebEfp7jvvvvy9ttvZ8yYMfPXrbvuull11VUzceLEzojLu0ybNi2DBw9+z+0cYx1rzpw5ue+++5odG/X19RkzZkyLx8bEiRObbZ+U72mOpWpMmzYtSd7zeHrzzTez2mqrZeTIkdl1111b/PuD9vevf/0rI0aMyPvf//7su+++mTRpUovbOr5qy5w5c3LRRRfly1/+curq6lrczvFVG5566qlMnjy52TE0cODAjBo1qsVjqC3vg63Re6m/A/NNnjy5WaFOMv/ryZMnt7jPSiut1Gxd7969M3jw4Bb3oX2cd955GTt2bFZZZZXFbrfPPvtktdVWy4gRI/LQQw/l6KOPzuOPP57f//73nZS05/rGN76RzTbbLIMHD85dd92VY489Ni+++GJOPfXURW4/efLk9O3bd6FrHgwdOtTxVIEnnngiZ5xxRn76058udjvHWMebOnVq5s2bt8j3qMcee2yR+7T0nuZY6nyNjY355je/mQ9/+MPZYIMNWtxunXXWya9//etstNFGmTZtWn76059m6623ziOPPPKe73UsnVGjRuWCCy7IOuuskxdffDEnnHBCttlmmzz88MNZbrnlFtre8VVbrrrqqrz++uv50pe+1OI2jq/a0XSctOYYasv7YGv0+FJ9zDHH5Cc/+clit3n00Uff82ITVKctr+Fzzz2XG2+8MZdffvl7fv93fr59ww03zPDhw/PJT34yTz75ZNZcc822B++hWvN6jRs3bv66jTbaKH379s3Xvva1jB8/Pg0NDR0dlf/TlmPs+eefz/bbb5/Pfe5zOeiggxa7r2MMFu/QQw/Nww8/vNjP6CbJ6NGjM3r06Plfb7311llvvfXy3//93/nhD3/Y0TF7tB122GH+eKONNsqoUaOy2mqr5fLLL8+BBx5YYTKWxHnnnZcddtghI0aMaHEbxxeL0+NL9VFHHbXY/yqVJO9///uX6HsNGzZsoSvINV11eNiwYS3u8+4Px8+dOzevvvpqi/vQXFtew/PPPz8rrLBCdtlll1b/vFGjRiUpz8L5g7/1luaYGzVqVObOnZunn34666yzzkLPDxs2LHPmzMnrr7/e7Gz1lClTHE9LobWv2QsvvJBtt902W2+9dc4999xW/zzHWPsbMmRIevXqtdCV8Bd3bAwbNqxV29MxDjvssPkXMW3t2bA+ffpk0003zRNPPNFB6WjJoEGDsvbaa7f4b+/4qh3PPPNMbr755lbPjnJ8VafpOJkyZUqGDx8+f/2UKVOyySabLHKftrwPtkaPL9UrrrhiVlxxxXb5XqNHj86PfvSjvPTSS/OndN90000ZMGBAPvjBD7a4z+uvv5777rsvm2++eZLklltuSWNj4/w/LFm81r6GRVHk/PPPz3777Zc+ffq0+uc9+OCDSdLsIGbJLc0x9+CDD6a+vn6hj0w02XzzzdOnT59MmDAhu+++e5Lk8ccfz6RJk5r912VapzWv2fPPP59tt902m2++ec4///zU17f+0h2OsfbXt2/fbL755pkwYUJ22223JOWU4gkTJuSwww5b5D6jR4/OhAkT8s1vfnP+uptuusmx1EmKosjhhx+eK6+8MrfeemvWWGONVn+PefPm5e9//3t23HHHDkjI4rz55pt58skn88UvfnGRzzu+asf555+flVZaKTvttFOr9nN8VWeNNdbIsGHDMmHChPklevr06bn77rtbvEtTW94HW2WpL3XWgzzzzDPFAw88UJxwwgnFsssuWzzwwAPFAw88ULzxxhtFURTF3Llziw022KDYbrvtigcffLC44YYbihVXXLE49thj53+Pu+++u1hnnXWK5557bv667bffvth0002Lu+++u7jjjjuKtdZaq9h77707/ffrKW6++eYiSfHoo48u9Nxzzz1XrLPOOsXdd99dFEVRPPHEE8UPfvCD4t577y2eeuqp4uqrry7e//73Fx/96Ec7O3aPc9dddxWnnXZa8eCDDxZPPvlkcdFFFxUrrrhisd9++83f5t2vV1EUxcEHH1ysuuqqxS233FLce++9xejRo4vRo0dX8Sv0OM8991zxgQ98oPjkJz9ZPPfcc8WLL744//HObRxj1bj00kuLhoaG4oILLij+8Y9/FF/96leLQYMGzb9jxRe/+MXimGOOmb/9nXfeWfTu3bv46U9/Wjz66KPF8ccfX/Tp06f4+9//XtWv0KMccsghxcCBA4tbb7212bE0c+bM+du8+zU74YQTihtvvLF48skni/vuu6/4/Oc/X/Tr16945JFHqvgVepSjjjqquPXWW4unnnqquPPOO4sxY8YUQ4YMKV566aWiKBxftWrevHnFqquuWhx99NELPef4qtYbb7wxv2slKU499dTigQceKJ555pmiKIrixBNPLAYNGlRcffXVxUMPPVTsuuuuxRprrFG89dZb87/HJz7xieKMM86Y//V7vQ8uDaW6Ffbff/8iyUKPP//5z/O3efrpp4sddtih6N+/fzFkyJDiqKOOKt5+++35z//5z38ukhRPPfXU/HWvvPJKsffeexfLLrtsMWDAgOKAAw6YX9Rpf3vvvXex9dZbL/K5p556qtlrOmnSpOKjH/1oMXjw4KKhoaH4wAc+UHzrW98qpk2b1omJe6b77ruvGDVqVDFw4MCiX79+xXrrrVf8+Mc/LmbNmjV/m3e/XkVRFG+99Vbx9a9/vVh++eWLZZZZpvjMZz7TrNTRcc4///xF/n/kO//7rWOsWmeccUax6qqrFn379i222mqr4i9/+cv85z72sY8V+++/f7PtL7/88mLttdcu+vbtW6y//vrFtdde28mJe66WjqXzzz9//jbvfs2++c1vzn99hw4dWuy4447F/fff3/nhe6C99tqrGD58eNG3b99i5ZVXLvbaa6/iiSeemP+846s23XjjjUWS4vHHH1/oOcdXtZo607sfTa9JY2Nj8b3vfa8YOnRo0dDQUHzyk59c6HVcbbXViuOPP77ZusW9Dy6NuqIoiqU/3w0AAAA9j/tUAwAAQBsp1QAAANBGSjUAAAC0kVINAAAAbaRUAwAAQBsp1QAAANBGSjUAAAC0kVINAAAAbaRUAwAAQBsp1QAAANBGSjUAAAC00f8HxqjVS8U752QAAAAASUVORK5CYII=\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 创建一个从-10到9.5的数组，步长为0.5。该数组将包含从-10开始，以0.5递增的一系列数字\n",
    "nums = np.arange(-10, 10, step=0.5)\n",
    "# 做一个快速的检查，来确保它可以工作\n",
    "fig, ax = plt.subplots(figsize=(12, 8))\n",
    "ax.plot(nums, sigmoid(nums), 'r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 代价函数\n",
    "\n",
    "![](img/cost.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def cost(theta, X, Y):\n",
    "    # \"@\"符号表示矩阵乘法，\"X@theta.T\"表示将矩阵\"X\"和参数向量\"theta\"进行相乘，并转置参数向量。\n",
    "    # 目标变量\"Y\"与\"sigmoid(X@theta.T)\"的每个元素的自然对数相乘。\n",
    "    first = Y * np.log(sigmoid(X@theta.T))\n",
    "    second = (1 - Y) * np.log(1 - sigmoid(X@theta.T))\n",
    "    # \"np.mean(first + second)\"表示对这个新数组中的所有元素求平均值。\n",
    "    return -1 * np.mean(first + second)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "预处理数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "data.insert(0, 'Ones', 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 从第0列到倒数第2列（0: -1）\n",
    "X = data.iloc[:, 0: -1].values\n",
    "Y = data.iloc[:, -1].values\n",
    "theta = np.zeros(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "检查矩阵的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([0., 0., 0.])"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "((100, 3), (100,), (3,))"
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape, Y.shape, theta.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "计算初始的代价（theta=0）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.6931471805599453"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(theta, X, Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 梯度下降\n",
    "\n",
    "![](img/gradient.png)\n",
    "\n",
    "[偏导的推导过程](https://sanzo.top/#/post/学习笔记/机器学习?id=梯度下降)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 计算步长\n",
    "def gradient(theta, X, Y):\n",
    "    return (1/len(X) * X.T @ (sigmoid(X @ theta.T) - Y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([ -0.1       , -12.00921659, -11.26284221])"
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gradient(theta, X, Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "gradient只是计算了梯度下降$\\theta$更新的步长，使用Scipy.optimize.fmin_tnc拟合最优的$\\theta$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 拟合参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "(array([-25.1613187 ,   0.20623159,   0.20147149]), 36, 0)"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.optimize as opt\n",
    "result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, Y))\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.20349770158947428"
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(result[0], X, Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 预测分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "根据$\\theta$进行预测：${h_\\theta(x)=\\frac{1}{1+e^{-\\theta^TX}}}$\n",
    "\n",
    "$h_\\theta\\ge0.5$, 预测$y=1$\n",
    "\n",
    "$h_\\theta<0.5$, 预测$y=0$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def predict(theta, X):\n",
    "    probability = sigmoid(X @ theta.T)\n",
    "    # 列表推导式\n",
    "    return [1 if x >= 0.5 else 0 for x in probability]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "模型准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-25.1613187    0.20623159   0.20147149]\n",
      "[[-25.1613187    0.20623159   0.20147149]]\n",
      "accuracy = 89%\n"
     ]
    }
   ],
   "source": [
    "# 转换为矩阵对象\n",
    "theta_min = np.matrix(result[0])\n",
    "predictions = predict(theta_min, X)\n",
    "# \"zip(predictions, Y)\"将两个列表按元素进行配对，生成一个可迭代的对象，每个元素是一个元组，包含了对应位置上的预测值和目标值。\n",
    "correct = [1 if a^b == 0 else 0 for (a,b) in zip(predictions, Y)]\n",
    "accuracy = (sum(correct) / len(correct))\n",
    "print('accuracy = {0:.0f}%'.format(accuracy*100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.87      0.85      0.86        40\n",
      "           1       0.90      0.92      0.91        60\n",
      "\n",
      "    accuracy                           0.89       100\n",
      "   macro avg       0.89      0.88      0.88       100\n",
      "weighted avg       0.89      0.89      0.89       100\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# support标签中出现的次数\n",
    "# precision查准率，recall召回率，f1-score调和平均数\n",
    "from sklearn.metrics import classification_report\n",
    "print(classification_report(Y, predictions))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}